package SegundaEntregaTest;

import java.util.ArrayList;

import java.util.Iterator;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import ComoViajo.Direccion;
import ComoViajo.EstacionSubte;
import ComoViajo.EstacionTren;
import ComoViajo.FactoryEstaciones;
import ComoViajo.Viaje;


public class Requerimiento1ViajesEnColectivo {

	@Before
	public void fixture() {
		String ramalSubte = "B";
		EstacionSubte B1,B2,B3,B4,B5,A1,A2,A3,A4;
		EstacionTren est1,est2,est3,est4;

		B1=FactoryEstaciones.crearEstacionSubte("1", ramalSubte,new Direccion("corrientes", 0));
		B2=FactoryEstaciones.crearEstacionSubte("angel gallardo", ramalSubte,new Direccion("corrientes", 4700));
		B3=FactoryEstaciones.crearEstacionSubte("abasto", ramalSubte,new Direccion("corrientes", 3300));
		B4=FactoryEstaciones.crearEstacionSubte("medrano", ramalSubte,new Direccion("corrientes", 4000));
		B5=FactoryEstaciones.crearEstacionSubte("combinaconUncolectivo99", ramalSubte,new Direccion("pasaEl99", 2000));
		
		ramalSubte = "A";
		A1=FactoryEstaciones.crearEstacionSubte("1", ramalSubte,new Direccion("rivadavia", 4300));
		A2=FactoryEstaciones.crearEstacionSubte("acoyte", ramalSubte,new Direccion("rivadavia", 5000));
		A3=FactoryEstaciones.crearEstacionSubte("3", ramalSubte,new Direccion("rivadavia", 5550));
		A4=FactoryEstaciones.crearEstacionSubte("4", ramalSubte,new Direccion("rivadavia", 6000));
		
		A1.conectar(null, A2);
		A2.conectar(A1, A3);
		A3.conectar(A2, A4);
		A4.conectar(A3, null);
				
		B1.conectar(null, B2);
		B2.conectar(B1, B3);
		B3.conectar(B2, B4);
		B4.conectar(B3, B5);
		B5.conectar(B4, null);
		
		B4.addEstacionQueCombina(A3);
		A3.addEstacionQueCombina(B4);
		
		est1=FactoryEstaciones.crearEstacionTren("1","sarmiento", new Direccion("dosColectivos11y6", 2051));
		est2=FactoryEstaciones.crearEstacionTren("2","sarmiento", new Direccion("nada", 20));
		est3=FactoryEstaciones.crearEstacionTren("3","sarmiento", new Direccion("nada", 30));
		est4=FactoryEstaciones.crearEstacionTren("4","sarmiento", new Direccion("dosColectivos12y99", 4020));
		
		est1.conectar(null, est2);
		est2.conectar(est1, est3);
		est3.conectar(est2, est4);
		est4.conectar(est3, null);
	}
	
	
	@Test
	public void testViajeUnColectivoConUnColectivo() {
		ArrayList<Viaje> viajes =Viaje.getViajes(new Direccion("unSoloColectivo99", 663), new Direccion("unSoloColectivo99", 1951));
		
		Assert.assertEquals("[{99 unSoloColectivo99 663,99 unSoloColectivo99 1951}]", viajes.toString());
	
		viajes=Viaje.getViajes(new Direccion("dosColectivos105y146", 663), new Direccion("unSoloColectivo99", 1951));
		
		Assert.assertEquals("[]", viajes.toString());

		
		viajes =Viaje.getViajes(new Direccion("unSoloColectivo99", 663), new Direccion("dosColectivos12y99", 2051));
		Assert.assertEquals("[{99 unSoloColectivo99 663,99 dosColectivos12y99 2051}]", viajes.toString());
		
		
		viajes =Viaje.getViajes(new Direccion("dosColectivos11y6", 663), new Direccion("dosColectivos11y6", 2051));
		Assert.assertEquals("[{11 dosColectivos11y6 663,11 dosColectivos11y6 2051}, {6 dosColectivos11y6 663,6 dosColectivos11y6 2051}]", viajes.toString());
		
	}
	
	@Test
	public void testViajeUnColectivoConSubte() {
		ArrayList<Viaje> viajes =Viaje.getViajes(new Direccion("unSoloColectivo99", 663), new Direccion("unSoloSubteB", 1951));
		Assert.assertEquals("[{99 unSoloColectivo99 663,99 pasaEl99 2000}{BcombinaconUncolectivo99}]", viajes.toString());

		viajes =Viaje.getViajes(new Direccion("elSubteAbasto", 1951),new Direccion("unSoloColectivo99", 663));
		String viajeExpected="[{Babasto,Bmedrano,BcombinaconUncolectivo99}{99 pasaEl99 2000,99 unSoloColectivo99 663}]";	
		Assert.assertEquals(viajeExpected, viajes.toString());

		// desde mas atras de la linea "B"
		viajes=Viaje.getViajes(new Direccion("elSubteAbasto", 3300), new Direccion("dosColectivos12y99", 2051));
		viajeExpected="[{Babasto,Bmedrano,BcombinaconUncolectivo99}{99 pasaEl99 2000,99 dosColectivos12y99 2051}]";
		Assert.assertEquals(viajeExpected, viajes.toString());
	
	}
	
	@Test
	public void testViajeUnColectivoConTren() {
		ArrayList<Viaje> viajes=Viaje.getViajes(new Direccion("unSoloColectivo99", 663), new Direccion("unSoloTrenSarmiento", 1951));
		String viajeExpected="[{99 unSoloColectivo99 663,99 dosColectivos12y99 4020}{sarmiento4,sarmiento3}]";	
		Assert.assertEquals(viajeExpected, viajes.toString());
						
		
		viajes =Viaje.getViajes(new Direccion("unSoloTrenSarmiento", 1951),new Direccion("unSoloColectivo99", 663));
		viajeExpected="[{sarmiento3,sarmiento4}{99 dosColectivos12y99 4020,99 unSoloColectivo99 663}]";	
		Assert.assertEquals(viajeExpected, viajes.toString());
	}
	
	@Test
	public void testViajeMuchosTransportesAMuchosTransportes() {
		ArrayList<Viaje> viajes =Viaje.getViajes(new Direccion("muchosColectivoSubteTren(A)", 663), new Direccion("muchosColectivoSubteTren(B)", 1951));
		String viajeExpected="[{Babasto,Bmedrano,BcombinaconUncolectivo99}{99 pasaEl99 2000,99 muchosColectivoSubteTren(B) 1951}, {sarmiento1,sarmiento2,sarmiento3,sarmiento4}{99 dosColectivos12y99 4020,99 muchosColectivoSubteTren(B) 1951}, {150 muchosColectivoSubteTren(A) 663,150 muchosColectivoSubteTren(B) 1951}, {99 muchosColectivoSubteTren(A) 663,99 muchosColectivoSubteTren(B) 1951}]";	
		Assert.assertEquals(viajeExpected, viajes.toString());	
		
	}
	
	
	@Test
	public void testGetCosto() {
		Iterator<Viaje> viajesItr =Viaje.getViajes(new Direccion("muchosColectivoSubteTren(A)", 663), new Direccion("muchosColectivoSubteTren(B)", 1951)).iterator();
		Viaje v;
		Float expected;
		
		ArrayList<Float> expectedArr= new ArrayList<Float>();
		
		expectedArr.add(new Float(2.35)); // subte + colectivo caro
		expectedArr.add(new Float(1.95)); // 4 trenes + colectivo barato
		expectedArr.add(new Float(1.10)); // boleto de colectivo barato
		expectedArr.add(new Float(1.10)); // boleto de colectivo barato
		expectedArr.add(new Float(2.35)); // colectivo caro + subte 
		
		Iterator<Float> expectedItr = expectedArr.iterator();
		
		while(viajesItr.hasNext()){
			v=viajesItr.next();
			expected=expectedItr.next();
			
			Assert.assertEquals(expected, v.getCosto(),0.1);
		}
	}
	
	@Test
	public void testGetTiempo() {
		ArrayList<Viaje> viajes =Viaje.getViajes(new Direccion("muchosColectivoSubteTren(A)", 663), new Direccion("muchosColectivoSubteTren(B)", 1951));
		Viaje viajeDeColectivo = viajes.get(0);
		Assert.assertEquals(66, viajeDeColectivo.getTiempo());		
	}

}
